package com.lw.controller;

import cn.dev33.satoken.annotation.SaCheckPermission;
import com.lw.common.aop.LogOperation;
import com.lw.common.enums.LogModuleEnum;
import com.lw.common.utils.ResultVo;
import com.lw.common.utils.StrUtils;
import com.lw.common.vo.Option;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.util.LambdaGetter;
import jakarta.annotation.Resource;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import com.lw.entity.TbRole;
import com.lw.service.TbRoleService;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import java.util.List;

import static com.lw.entity.table.TbRoleTableDef.TB_ROLE;

/**
 * 角色管理 控制层。
 *
 * @author lw
 * @since 2025年05月11日 12:11:42
 */
@RestController
@Tag(name = "02-角色管理接口")
@RequestMapping("/tbRole")
public class TbRoleController {

    @Resource
    private TbRoleService tbRoleService;

    /**
     * 添加角色管理。
     *
     * @param tbRole 角色管理
     * @return {@code true} 添加成功，{@code false} 添加失败
     * sql查询 两个条件或关系查询 , 或者查询案例
     */
    @PostMapping("save")
    @Operation(description="保存角色管理")
    @SaCheckPermission("sys:role:add")
    @LogOperation(module = LogModuleEnum.LOG_ROLE, value = "保存角色管理", params = false,result = false)
    public ResultVo<Boolean> save(@RequestBody @Parameter(description="角色管理")TbRole tbRole) {
        // 检查角色名称不能为空
        if (!StrUtils.hasLength(tbRole.getName())) {
            return ResultVo.error("角色名称不能为空");
        }
        //检查角色或编码是否重复
        if (!StrUtils.hasLength(tbRole.getCode())) {
            return ResultVo.error("角色编码不能为空");
        }
        QueryWrapper queryWrapper = QueryWrapper.create();
        queryWrapper.where(TB_ROLE.NAME.eq(tbRole.getName())).or(TB_ROLE.CODE.eq(tbRole.getCode()));
        if (tbRoleService.exists(queryWrapper)) {
            return ResultVo.error("角色名称或角色编码已存在");
        }
        return ResultVo.success(tbRoleService.save(tbRole));
    }

    /**
     * 根据主键删除角色管理。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("removeRoleById/{id}")
    @Operation(description="根据主键删除角色")
    @SaCheckPermission("sys:role:delete")
    @LogOperation(module = LogModuleEnum.LOG_ROLE, value = "根据主键删除角色", params = false,result = false)
    public ResultVo<Boolean> remove(@PathVariable("id") @Parameter(description="角色管理主键")Long id) {
        return ResultVo.success(tbRoleService.removeRoleById(id));
    }

    /**
     * 根据主键更新角色管理。
     *
     * @param tbRole 角色管理
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update")
    @Operation(description="根据主键更新角色管理")
    @SaCheckPermission("sys:role:edit")
    @LogOperation(module = LogModuleEnum.LOG_ROLE, value = "根据主键更新角色管理", params = false,result = false)
    public ResultVo<Boolean> update(@RequestBody @Parameter(description="角色管理主键")TbRole tbRole) {
        return ResultVo.success(tbRoleService.updateById(tbRole));
    }

    /**
     * 查询所有角色管理。
     *
     * @return 所有数据
     */
    @GetMapping("getRoleListOptions")
    @Operation(description="查询所有角色管理")
    public ResultVo<List<Option<Long>>> getRoleListOptions() {
        return ResultVo.success(tbRoleService.getRoleListOptions());
    }

    /**
     * 根据角色管理主键获取详细信息。
     *
     * @param id 角色管理主键
     * @return 角色管理详情
     */
    @GetMapping("getInfo/{id}")
    @Operation(description="根据主键获取角色管理")
    public ResultVo<TbRole> getInfo(@PathVariable("id") Long id) {
        return ResultVo.success(tbRoleService.getById(id));
    }

    /**
     * 分页查询角色管理。
     * @return 分页对象
     */
    @GetMapping("page")
    @Operation(description="分页查询角色管理")
    public ResultVo<Page<TbRole>> page(TbRole role) {
        return ResultVo.success(tbRoleService.getRolePage(role));
    }

}
